﻿/*------------------------------------------------------------------------

CENTRALIZEDMGR.HPP v3.8

Copyright 楊志賢 CxxlMan, 2008 - 2013
All Rights Reserved


------------------------------------------------------------------------*/

#if !defined(__CENTRALIZEDMGR_HPP_CxxlMan)
#define __CENTRALIZEDMGR_HPP_CxxlMan

#include <sstream>
#include "SMART_STRING.HPP"
#include "CXXLLIST.HPP"
#include "PRESERVECOMMON.HPP"
#include "CXXLCOMPOSITE.HPP"
#include "PRESERVE2.HPP"


#if defined(_CXXLPRESERVE_DLLEXPORT)
#define CXXLPRESERVE_DLLEXPORT CXXL_DLLEXPORT
#else
#define CXXLPRESERVE_DLLEXPORT CXXL_DLLIMPORT
#endif


namespace CxxlMan
{


// 指定搜尋路徑
CXXLPRESERVE_DLLEXPORT void cxxlFASTCALL cxxlCM_Init(const Smart_Ptr<cxxlList<string_wrapper<wchar_t> > > &SearchPath_list);

// 取得搜尋路徑
CXXLPRESERVE_DLLEXPORT Smart_Ptr<cxxlList<string_wrapper<wchar_t> > > cxxlFASTCALL cxxlCM_GetSearchPath();


// 註冊一個元件，若失敗表示 ClassID 已註冊過了
CXXLPRESERVE_DLLEXPORT bool cxxlFASTCALL cxxlCM_ElementReg(const UNICODE_String &ClassID, const UNICODE_String &Group, const UNICODE_String &Dll);

// 從元件註冊庫取得指定元件(dll 檔)名稱，若失敗回覆 NULL
CXXLPRESERVE_DLLEXPORT UNICODE_String cxxlFASTCALL cxxlCM_ElementGet(const UNICODE_String &ClassID, const UNICODE_String &Group);

// 查詢 Obj 物件是由哪個元件檔(dll 檔)產件的，含完整路徑。
// 若 Obj 不是由 cxxlCM_GetElement() 產件的回覆 NULL
CXXLPRESERVE_DLLEXPORT UNICODE_String cxxlFASTCALL cxxlCM_Where(const Smart_Ptr<cxxlObject> &Obj);


// 刪除一個元件的註冊
CXXLPRESERVE_DLLEXPORT void cxxlFASTCALL cxxlCM_ElementDel(const UNICODE_String &ClassID, const UNICODE_String &Group);

// 刪除指定的 Group
CXXLPRESERVE_DLLEXPORT void cxxlFASTCALL cxxlCM_ElementDelGroup(const UNICODE_String &Group);

// 匯入元件註冊表，UUID 若存在不會覆寫
// 若失敗表示註冊表不正確
CXXLPRESERVE_DLLEXPORT bool cxxlFASTCALL cxxlCM_ElementImport(std::wistream &TLC);

// 匯入元件註冊表，UUID 若存在不會覆寫
// 若失敗表示 Reg 是 NULL
CXXLPRESERVE_DLLEXPORT bool cxxlFASTCALL cxxlCM_ElementImport(const Smart_Ptr<cxxlComposite<string_wrapper<wchar_t>,true> > &Reg);



// 索取一個元件
// 失敗回傳 NULL
CXXLPRESERVE_DLLEXPORT Smart_Ptr<cxxlObject> cxxlFASTCALL cxxlCM_GetElement(  // 只在指定的 Group 尋找
  const UNICODE_String &ClassID,
  const UNICODE_String &Group = UNICODE_String(), // 若指定為 NULL，則在所有 Group 中尋找
  void *Arg = NULL,
  ISpirit *spirit = Spirit_Easy);

// 物件再生
CXXLPRESERVE_DLLEXPORT REGENERARETURN_TYPE cxxlFASTCALL cxxlCM_Regenera(Smart_Ptr<cxxlPreserve2> &P2_Ret, const UNICODE_String &Name, const Smart_Ptr<IcxxlStorage> &IcxxlStorage_Arg, bool isRestore);

// 切斷 IcxxlStorage_Arg 中所有 cxxlPreserve2 永存資料的資訊
// ClearObjID 若為 true 即讓 ObjID 資訊失去作用，再生時不再是共用物件，會產生獨立的物件
// DelRestore 若為 true，除了 cxxlPreserve2 的永存資料外，其他永存資料全刪除，這樣只能做純粹再生
// 若 ClearObjID 為 true，有循環參照會回覆 false，回傳值只有 ClearObjID 為 true 才有意義
CXXLPRESERVE_DLLEXPORT bool cxxlFASTCALL cxxlCM_CutPreserve2(const Smart_Ptr<IcxxlStorage> &IcxxlStorage_Arg, bool ClearObjID, bool DelRestore);

// 切斷 IcxxlStorage_Arg 中，指定名稱的 cxxlPreserve2 永存資料的資訊
// ClearObjID 若為 true 即讓 ObjID 資訊失去作用，再生時不再是共用物件，會產生獨立的物件
// DelRestore 若為 true，除了 cxxlPreserve2 的永存資料外，其他永存資料全刪除，這樣只能做純粹再生
// 若 ClearObjID 為 true，有循環參照會回覆 false，回傳值只有 ClearObjID 為 true 才有意義，注意指定名稱的資料不存在仍回覆 true
CXXLPRESERVE_DLLEXPORT bool cxxlFASTCALL cxxlCM_CutPreserve2(const Smart_Ptr<IcxxlStorage> &IcxxlStorage_Arg, const UNICODE_String &Name, bool ClearObjID, bool DelRestore);


}   /* namespace CxxlMan */
#endif
